home *** CD-ROM | disk | FTP | other *** search
-
-
- #include "worm.h"
-
- RING *rP;
- static RECT _wormcage;
-
- /* ----------------------------------------------------------------- */
-
- BOOL GetScreenSize(void)
- {
- HDC screen;
-
- /* Create a device context for the screen. */
- screen=CreateDC("DISPLAY", NULL, NULL, NULL);
- if(!screen)
- return(FALSE);
-
- _wormcage.right = GetDeviceCaps(screen, HORZRES);
- _wormcage.bottom = GetDeviceCaps(screen, VERTRES);
-
- /* Delete the device context as soon as possible. */
- DeleteDC(screen);
-
- _wormcage.top = 0;
- _wormcage.left = 0;
-
- /* This creates a worm list. */
- rP = InitWormList();
- return(TRUE);
- }
-
- /* ----------------------------------------------------------------- */
-
- void WormUpdate(void)
- {
- HDC screen;
- static double dir=0.0;
- POINT currentTail, currentHead, previousHead;
- int size = GetSize();
- int stepSize = GetStep() + size;
-
-
- /* rP points to the head */
- previousHead = rP->center;
- currentTail = rP->next->center;
-
- /* make rP point to the tail: */
- rP = rP->next;
-
- #if 1 /* if using a 386 capable compiler */
- if(LSFR())
- dir+=INCREMENT;
- else
- dir-=INCREMENT;
- #endif
- #if 0 /* otherwise use the standard rand() */
- if(rand()<16384)
- dir+=INCREMENT;
- else
- dir-=INCREMENT;
- #endif
-
- /* update the coordinates of the new head (i.e the previous tail) */
- CALCULATE_DIR:
- rP->center.x = previousHead.x + (int)(stepSize*cos(dir));
- rP->center.y = previousHead.y - (int)(stepSize*sin(dir));
-
-
- if(rP->center.x < _wormcage.left)
- rP->center.x = _wormcage.right-1;
- if(rP->center.x > _wormcage.right)
- rP->center.x = _wormcage.left;
- if(rP->center.y < _wormcage.top)
- rP->center.y = _wormcage.bottom-1;
- if(rP->center.y > _wormcage.bottom)
- rP->center.y = _wormcage.top;
-
-
- screen=CreateDC("DISPLAY", NULL, NULL, NULL);
- SelectObject(screen, GetStockObject(BLACK_BRUSH) );
- SetROP2(screen, R2_NOTXORPEN);
- SelectObject(screen, GetStockObject(BLACK_PEN) );
-
- /* erase the currentTail */
- if( (IsOnDesktop(currentTail)) && (rP->state == ACTIVE) &&
- (rP->color == GetPixel(screen, currentTail.x, currentTail.y))) {
- Ellipse(screen, currentTail.x - size, currentTail.y - size,
- currentTail.x + size, currentTail.y + size);
-
- }
- /* display new head */
- currentHead = rP->center;
- if(IsOnDesktop(currentHead)) {
- Ellipse(screen, currentHead.x - size, currentHead.y - size,
- currentHead.x + size, currentHead.y + size);
- rP->color = GetPixel(screen, currentHead.x, currentHead.y);
- rP->state = ACTIVE;
- }
- else
- rP->state = INACTIVE;
-
- /* release the device context as soon as possible */
- DeleteDC(screen);
- }
-
- /* -------------------------------------------------------------- */
-
- void CleanUp(void)
- {
- HDC screen;
- int i;
- int size = GetSize();
- POINT point;
- RECT rect;
-
-
- screen=CreateDC("DISPLAY", NULL, NULL, NULL);
-
- SelectObject(screen, GetStockObject(BLACK_BRUSH) );
- SetROP2(screen, R2_NOTXORPEN);
- SelectObject(screen, GetStockObject(BLACK_PEN) );
-
- for(i=0; i < GetRings() ; i++) {
- point = rP->center;
- if((IsOnDesktop(point)) && (rP->state == ACTIVE) &&
- (rP->color == GetPixel(screen, point.x, point.y)))
- rect.left = point.x - size;
- rect.top = point.y - size;
- rect.right = point.x + size;
- rect.bottom = point.y + size;
- InvalidateRect(GetDesktopWindow(), &rect, TRUE);
- //Ellipse(screen, point.x - size, point.y - size,
- // point.x + size, point.y + size);
- rP->state = INACTIVE;
- rP = rP->next;
- } /* for */
-
- DeleteDC(screen);
- }
-
- /* ------------------------------------------------------------------- */
-
-
- /* EOF */